package protocol

var (
	// 用户数据
	MSG_SUCCESS          = &CodeState{Code: 0, Message: "success"}        //注册成功
	MSG_Register_Existed = &CodeState{Code: 1, Message: "existed user"}   //注册用户已存在
	MSG_Login_Error      = &CodeState{Code: 2, Message: "login fail"}     //登录失败 信息错误
	MSG_Version_Error    = &CodeState{Code: 3, Message: "version wrong"}  //版本号不对
	MSG_User_Not_Exist   = &CodeState{Code: 4, Message: "user not exist"} //用户不存在
	MSG_DB_Error         = &CodeState{Code: 111, Message: "db error"}     //数据库出错

	//房间错误信息 1000开始标记
	MSG_ROOM_NOTAUTH    = &CodeState{Code: 1001, Message: "Unauthorized"}     //没有权限
	MSG_ROOM_ERRORPWD   = &CodeState{Code: 1002, Message: "pwd wrong"}        //密码错误
	MSG_ROOM_OVERVOLUME = &CodeState{Code: 1003, Message: "aleady in room"}   //你已经在其他房间了 拒绝加入其他房间
	MSG_ROOM_NOMONEY    = &CodeState{Code: 1004, Message: "not enough money"} //起始资金不够
	MSG_ROOM_NOTEMPTY   = &CodeState{Code: 1005, Message: "room not empty"}   //房子不空
	MSG_ROOM_NOROOM     = &CodeState{Code: 1006, Message: "no room"}          //没有该房子记录
	MSG_ROOM_FULL       = &CodeState{Code: 1007, Message: "room full"}        // 房间已满
	MSG_NOT_IN_ROOM     = &CodeState{Code: 1008, Message: "not in room"}      // 你不在房间
	MSG_ROOM_CLOSED     = &CodeState{Code: 1009, Message: "room closed"}      // 房间已经关闭
	MSG_NOT_TURN        = &CodeState{Code: 1010, Message: "not your turn"}    // 没轮到你下注
	MSG_NOT_NOT_START   = &CodeState{Code: 1011, Message: "game not start"}   // 游戏未开始不能下注
)

//func init() {
//	Processor.Register(&Hello{})
//	Processor.Register(&UserLoginInfo{})
//	Processor.Register(&UserLoginInfoResp{})
//
//	Processor.Register(&CodeState{})
//	Processor.Register(&Version{})
//
//	//房间会话注册
//	Processor.Register(&RoomInfo{})  //基本信息
//	Processor.Register(&JoinRoom{})  //
//	Processor.Register(&LeaveRoom{}) //
//
//	Processor.Register(&Showdown{})
//	Processor.Register(&PreFlop{})
//	Processor.Register(&Pot{})
//	Processor.Register(&Bet{})
//	Processor.Register(&Button{})
//	Processor.Register(&StandUp{})
//	Processor.Register(&SitDown{})
//	Processor.Register(&UserInfo{})
//	Processor.Register(&JoinRoomResp{})
//	Processor.Register(&JoinRoomBroadcast{})
//	Processor.Register(&BetResp{})
//	Processor.Register(&RoomList{})
//	Processor.Register(&RoomListResp{})
//	Processor.Register(&Chat{})
//}

// 版本号
type Version struct {
	Version string
}

type CodeState struct {
	Code    int    // const
	Message string //警告信息
}

type Hello struct {
	Name string
}

//登录
type UserLoginInfo struct {
	UnionId  string
	Nickname string
}

//登录
type UserLoginInfoResp struct {
	UnionId  string
	Uid      uint32 // 用户id
	Account  string // 客户端玩家展示的账号
	Nickname string // 微信昵称
	Sex      uint8  // 微信性别 0-未知，1-男，2-女
	Profile  string // 微信头像
	Chips    uint32 // 筹码
}

type UserInfo struct {
	Uid      uint32 `json:"uid"` // 用户id
	Account  string `json:"account"` // 客户端玩家展示的账号
	Nickname string `json:"nickname"`// 微信昵称
	Sex      uint8  `json:"sex"`// 微信性别 0-未知，1-男，2-女
	Profile  string `json:"profile"`// 微信头像
	Chips    uint32 `json:"chips"`// 筹码
	Pos		 uint8	`json:"pos"`// 座位号
}

type UserSeat struct {
	Avatar       string      `json:"avatar"`       // 头像
	Chips        uint32      `json:"chips"`        // 筹码
	CurrentChips []uint32    `json:"currentChips"` //玩家不同游戏阶段下注的数组
	IsGiveUp    bool         `json:"isGiveUp"`     //是否弃牌
	IsAllIn     bool         `json:"isAllIn"`      //是否Allin
	IsMySelf    bool         `json:"isMySelf"`     //用于广播中判断是否是客户端的玩家自身
	IsLeaveRoom bool         `json:"isLeaveRoom"`  //是否离开房间
	IsSitUp     bool         `json:"isSitUp"`      //是否站起
	Level       int          `json:"level"`        //牌大小枚举
	Name        string       `json:"name"`         //玩家名称
	Pokes       []int        `json:"pokes"`        //玩家手中扑克牌数组
	Position    uint8        `json:"position"`     //玩家位置
	UserId      int64        `json:"userId"`       //玩家Id
	WinnerChips int          `json:"winnerChips"`  //胜利赢得得记分牌
	Actions     []UserAction `json:"actions"`      //玩家动作集合
}

type RoomInfo struct {
	RoomId    string `json:"roomId"`
	Owner	  uint32 `json:"owner"`//房主Pid
	Time	  uint32 `json:"time"`//牌局的时间
	CreateTime string `json:"createTime"`//unix时间

	Volume    uint8
	GameType  uint32 //游戏类型 即玩法
	PayValue  uint8  //倍数
	BaseMoney uint32 //最低资本 才能进房间
	RoomPwd   string //房间锁--密码
	DraginChips uint32`json:"chips"`
	//CreateTime string
	SB       uint32   `json:"sb"`// 小盲注
	BB       uint32   `json:"bb"`// 大盲注
	Cards    []byte   //公共牌
	Pot      []uint32 // 当前奖池筹码数
	Timeout  uint8    // 倒计时超时时间(秒)
	Button   uint8    // 当前庄家座位号，从1开始
	Chips    []uint32 // 玩家本局下注的总筹码数，与occupants一一对应
	Bet      uint32   // 当前下注额
	Max      uint8    `json:"max"`// 房间最大玩家人数
	MaxChips uint32
	MinChips uint32
}

type StandUp struct {
	Code int `json:"code"`
	Position uint8 `json:"position"`
}

type SitDown struct {
	Uid uint32
	Pos uint8
}

type LeaveRoom struct {
	RoomNumber string
	Uid        uint32
}

type JoinRoom struct {
	Uid        string
	RoomId 	   string `json:"roomId"`
	RoomPwd    string
}

type CreateRoom struct {
	//{"max":9,"sb":5,"bb":10,"chips":1000}
	Max int `json:"max"`
	Sb int `json:"sb"`
	Bb int `json:"bb"`
	Chips int `json:"chips"`
	Time int `json:"time"`
}

type JoinRoomBroadcast struct {
	UserInfo *UserInfo
}

type SitDownBroadcast struct {
	Code 	  int  `json:"code"`// 响应状态: 0 表示正常， 1 表示当前位置有玩家
	UserSeat *UserSeat `json:"userSeat"`
}

type JoinRoomResp struct {
	UserInfos []*UserInfo `json:"user_infos"`
	RoomInfo  *RoomInfo `json:"room_info"`
}

type JoinRoomResponse struct {
	SB            uint32 `json:"sb"`             // 小盲注
	BB            uint32 `json:"bb"`             // 大盲注
	Clients       []int  `json:"clients"`        //当前加入房间的玩家位置的数组
	Chips         uint32 `json:"chips"`          //总记分牌
	CreateTime    string `json:"createTime"`     //开房时间
	CurrentDepend uint8  `json:"current_depend"` //当前庄家位置
	CurrentPerson uint8  `json:"current_person"` //目前玩家人数
	History       string `json:"history"`        //房间游戏记录
	Max           uint8  `json:"max"`			 //房间最大人数
	Owner         int64  `json:"owner"`			 //房主位置
	RoomId        string `json:"roomId"`         //房间id
	Seats         []*UserSeat `json:"seats"`     //座位上的玩家数组
	State         uint8  `json:"state"`          //游戏状态
	Time          uint32 `json:"time"`           //房间时间
	Name		  string `json:"name"`           //房主名称
	IsBegin       bool `json:"isBegin"`          //房间是否开始过游戏

}

//开始游戏响应
type StartGameResp struct {
	 AllCount    uint32 `json:"allCount"`    //底池大小
	 BaseChip    uint32 `json:"baseChip"`    //大盲注，用于下注
	 CurrentChip uint32 `json:"currentChip"` //当前阶段下的最大注数
	 Depend      uint8  `json:"depend"`      //庄家位置
	 FollowBet   uint32 `json:"followBet"`   //跟注注数
	 GameState   int    `json:"gameState"`   //游戏状态枚举
	 IsBb        uint8  `json:"isBb"`        //大盲注位置
	 IsSb        uint8  `json:"isSb"`        //小盲注位置
	 IsNext      uint8  `json:"isNext"`      //下一位投注玩家位置
	 Level       int    `json:"level"`       //玩家自身牌大小
	 Pokes       []int  `json:"pokes"`       //玩家自身发的扑克牌
	 Mult        int         `json:"mult"`
	 Seats       []*UserSeat `json:"seats"`
}

//游戏阶段2响应
type Round2Resp struct {
	AllCount  uint32 `json:"allCount"` //底池大小
	BaseChip  uint32 `json:"baseChip"` //大盲注，用于下注
	CanPass   bool   `json:"canPass"`  //能否让牌
	GameState int    `json:"gameState"`   //游戏状态枚举
	IsAllIn   bool   `json:"isAllIn"`//是否是 All In
	IsCurrent uint8  `json:"isCurrent"`//目前下注玩家
	Value     uint32 `json:"value"`//目前玩家下注的值
	Level     int    `json:"level"`     //玩家自身牌大小
	IsNext    uint8  `json:"isNext"`    //下一位投注玩家位置
	ShowPokes []int  `json:"showPokes"` //展示的3张公共牌
	ShowChipType int         `json:"showChipType"`
	AddChip      uint32      `json:"addChip"`
	Action       int         `json:"action"`
	Order        int         `json:"order"`
	Seats        []*UserSeat `json:"seats"`
}

//游戏阶段3响应
type Round3Resp struct {
	AllCount  uint32 `json:"allCount"` //底池大小
	BaseChip  uint32 `json:"baseChip"` //大盲注，用于下注
	CanPass   bool   `json:"canPass"`  //能否让牌
	GameState int    `json:"gameState"`   //游戏状态枚举
	IsAllIn   bool   `json:"isAllIn"`//是否是 All In
	IsCurrent uint8  `json:"isCurrent"`//目前下注玩家
	Value     uint32 `json:"value"`//目前玩家下注的值
	Level     int    `json:"level"`     //玩家自身牌大小
	IsNext    uint8  `json:"isNext"`    //下一位投注玩家位置
	ShowPokes []int  `json:"showPokes"` //展示的1张公共牌
	ShowChipType int         `json:"showChipType"`
	AddChip      uint32      `json:"addChip"`
	Action       int         `json:"action"`
	Order        int         `json:"order"`
	Seats        []*UserSeat `json:"seats"`
}
//游戏结束响应
type ResultResp struct {
	AllCount    uint32      `json:"allCount"` //底池大小
	BaseChip    uint32      `json:"baseChip"` //大盲注，用于下注
	GameSeats   []*UserSeat `json:"gameSeats"`
	GameState   int         `json:"gameState"`   //游戏状态枚举
	IsCurrent   uint8       `json:"isCurrent"`//目前下注玩家
	Value       uint32      `json:"value"`//目前玩家下注的值
	IsQuick     bool        `json:"isQuick"`
	SbUserId    int64       `json:"sbUserId"`    //小盲注的玩家 id
	Winner      []int     `json:"winner"`      //保存胜利玩家的数组
	WinnerPokes [][]int       `json:"winnerPokes"` //胜利玩家的牌数组
	ShowPokes 	[]int       `json:"showPokes"` //胜利玩家的牌数组
	ShowChipType int         `json:"showChipType"`
	AddChip      uint32      `json:"addChip"`
	Action       int         `json:"action"`
	Order        int         `json:"order"`
}

//下注响应
type BetBroadcastResp struct {
	AllCount    uint32       `json:"allCount"`    //底池大小
	BaseChip    uint32 	     `json:"baseChip"`    //大盲注，用于下注
	CanPass     bool    	 `json:"canPass"`     //能否让牌
	CurrentChip uint32 		 `json:"currentChip"` //当前阶段下的最大注数
	FollowBet    uint32 	 `json:"followBet"`   //跟注注数
	GameState    int     	 `json:"gameState"`   //游戏状态枚举
	IsAllIn      bool   	 `json:"isAllIn"`     //是否是 All In
	IsCurrent    uint8       `json:"isCurrent"`   //目前下注玩家
	Value        int32       `json:"value"`       //目前玩家下注的值
	IsNext       uint8       `json:"isNext"`      //下一位下注玩家
	IsEnd        uint8       `json:"isEnd"`       //当前回合结束下注标志
	Mult         int         `json:"mult"`
	ShowFourBB   bool        `json:"showFourBB"`
	ShowChipType int         `json:"showChipType"`
	AddChip      uint32      `json:"addChip"`
	Action       int         `json:"action"`
	Order        int         `json:"order"`
	Seats        []*UserSeat `json:"seats"`
}

//底牌
type PreFlop struct {
	Cards []byte
	Kind  uint8
}

// 翻牌
type Flop struct {
	Cards []byte
	Kind  uint8
}

// 转牌
type Turn struct {
	Card byte
	Kind uint8
}

//河牌
type River struct {
	Card byte
	Kind uint8
}

//通报本局庄家
type Button struct {
	Uid uint32
}

// 玩家提交下注数据
// 有四种下注方式，下注数分别对应为：
//弃牌: <0 (fold)
//跟注：等于单注额 (call)
//看注：= 0 表示看注 (check)
//加注：大于单注额 (raise)
//全押：等于玩家手中所有筹码 (allin)
type Bet struct {
	Value int32
}

// 提示指定的玩家下注
type BetPrompt struct {
}

// 通报玩家下注
type BetBroadcast struct {
	Value int32
	Kind  string
	Uid   uint32
}

type BetResp struct {
	Value int32
	Kind  string
	Uid   uint32
}

//通报奖池
type Pot struct {
	Pot []uint32
}

//摊牌和比牌
type Showdown struct {
	Showdown []*ShowdownItem
}

type ShowdownItem struct {
	Uid      uint32
	ChipsWin uint32
	Chips    uint32
}

type RoomList struct {
}

type Room struct {
	Rid             uint32
	Number          string // 给玩家展示的房间号
	State           uint8  //房间状态 0默认可用 1不可用
	Name            string //房间名字
	CreatedAt       uint32 //创建时间
	OriginalOwnerID uint32 //原始创建人的信息
	Owner           uint32 //房管
	Kind            uint32 //游戏类型 即玩法
	DraginChips     uint32 // 带入筹码
	Cap             uint8
	MaxCap          uint8
}

type RoomListResp struct {
	Room []*Room
}

type Chat struct {
	Uid  uint32
	Text string
}

//顺子类牌型的使用点数和比大小
type Straight struct {
	Point int  //点数和
}
//四条时比对四张和单张点数
type Four struct {
	Fpoint int	//四张的点数
	Opoint int  //单张的点数
}
//葫芦比对
type FullHouse struct {
	ThreePoint int	//三张的点数
	TwoPoint int  //一对的点数
}
//同花。如果不止一人抓到此牌相，则牌点最高的人赢得该局
type Flush struct {
	Cards []int
}
//比对完三张后
type Three struct {
	ThreePoint int	//三张的点数
	BigPoint   int  //剩下较大的点数
	SmallPoint int  //剩下的较小的点
}

type TwoPair struct {
	BigPoint   int //较大一对的点数
	SmallPoint int //较小一对的点数
	SingePoint int //单张的点数
}

type OnePair struct {
	PairPoint int
	Big       int
	Middle    int
	Small     int
}

type Show struct {
	Type   uint8		//牌型
	Struct interface{}	//牌型专属的struct
	Value  []int        //牌值数组
	Point  []int        //牌值数组
}

type MatchDetails struct {
	State        int     `json:"state"`
	AllCount     int     `json:"allCount"`
	Sb           int     `json:"sb,omitempty"`
	Bb           int     `json:"bb,omitempty"`
	SbUserID     int     `json:"sbUserId,omitempty"`
	Uid          int     `json:"uid,omitempty"`
	BbUserID     int     `json:"bbUserId,omitempty"`
	DependUserID int     `json:"dependUserId,omitempty"`
	ShowPokes    []int   `json:"showPokes,omitempty"`
	Users        []Users `json:"users,omitempty"`
	BaseChip     int     `json:"baseChip,omitempty"`
	IsNext       int     `json:"isNext,omitempty"`      //下一位玩家位置
	IsCurrent    int     `json:"isCurrent,omitempty"`   //当前玩家位置
	Value        int     `json:"value,omitempty"`       //当前玩家下注大小
	CanPass      int     `json:"canPass,omitempty"`     //是否让牌
	FollowBet    int     `json:"followBet,omitempty"`   //跟注大小
	CurrentChip int `json:"currentChip,omitempty"` //当前阶段最大下注大小
	IsAllIn     int `json:"isAllIn,omitempty"`
}

type Users  struct {
	UserID       int   `json:"userId"`
	Position     int   `json:"position"`
	CurrentChips int   `json:"currentChips"`
	Pokes        []int `json:"pokes"`
	Level        int   `json:"level"`
	Chips        int   `json:"chips"`
	IsWinner     int   `json:"isWinner,omitempty"`
	WinnerPokes  []int `json:"winnerPokes,omitempty"`
}

type GameInfo struct {
	GameState    int         `json:"gameState"`   //游戏状态枚举
	AllCount     uint32      `json:"allCount"` //底池大小
	GameSeats    []*UserSeat `json:"seats"`
	ShowPokes    []int       `json:"showPokes"` //胜利玩家的牌数组
	DependUserId int64       `json:"dependUserId"`
	SbUserId     int64       `json:"sbUserId"`    //小盲注的玩家 id
	CurrentUser  uint8       `json:"currentUser"`//目前下注玩家
	Times        float64     `json:"times"`
	FollowBet    uint32      `json:"followBet"`   //跟注注数
}

type UserAction struct {
	Action       int    `json:"action"`       // 动作类型
	ShowChipType int    `json:"showChipType"` // 筹码动画 1 - 不执行 2 - 展示筹码 3 - 添加筹码
	Value        uint32 `json:"value"`        // 投注大小
	Order        int    `json:"order"`        // 动作顺序
	State        int    `json:"state"`        // 游戏阶段
	AddChip      uint32 `json:"addChip"`      // 增加的筹码 当 showChipType 为 3 时才到
}
